home *** CD-ROM | disk | FTP | other *** search
Text File | 1998-12-02 | 9.6 KB | 459 lines | [TEXT/CWIE] |
- /*
- You may incorporate this Apple sample source code into your program(s) without
- restriction. This Apple sample source code has been provided "AS IS" and the
- responsibility for its operation is yours. You are not permitted to redistribute
- this Apple sample source code as "Apple sample source code" after having made
- changes. If you're going to re-distribute the source, we require that you make
- it clear in the source that the code was descended from Apple sample source
- code, but that you've made changes.
- */
-
- #include "ScriptableStuffItEngine.h" // app
- #include "StuffItEngineLib.h" // Aladdin
- #include "FullPath.h" // MoreFiles
-
- #include <Aliases.h>
- #include <PLStringFuncs.h>
- #include <Errors.h>
-
- static pascal OSErr RespondToCoreEvent
- (const AppleEvent *, AppleEvent *, AEEventID eventID)
- {
- OSErr err = errAEEventNotHandled;
-
- switch (eventID)
- {
- case kAEQuitApplication :
-
- gQuitting = true;
- err = noErr;
- break;
- }
-
- return err;
- }
-
- static pascal OSErr GetTextParameter (const AppleEvent *event, AEKeyword keyWord, UInt8 **pp)
- {
- OSErr err = noErr;
-
- DescType actualType;
- Size dataSize;
-
- if (!(err = AEGetParamPtr (event,keyWord,typeChar,&actualType,nil,0,&dataSize)))
- {
- UInt8 *dataP = (UInt8 *) ::NewPtr (dataSize);
-
- if (!dataP)
- err = ::MemError ( );
- else
- {
- Size actualSize;
-
- if (!(err = ::AEGetParamPtr (event,keyWord,typeChar,&actualType,dataP,dataSize,&actualSize)))
- {
- if (dataSize == actualSize)
- *pp = dataP;
- else
- {
- ::DebugStr ("\pFirst call to AEGetParamPtr lied about dataSize.");
- err = errAECorruptData;
- }
- }
-
- if (err) ::DisposePtr (Ptr (dataP));
- }
- }
-
- return err;
- }
-
- pascal OSErr GetOptionalTextParameter (const AppleEvent *event, AEKeyword keyWord, UInt8 **pp)
- {
- OSErr err = GetTextParameter (event,keyWord,pp);
-
- if (err == errAEDescNotFound)
- {
- *pp = nil;
- err = noErr;
- }
-
- return err;
- }
-
- pascal OSErr GetOptionalBoolean (const AppleEvent *ae, Boolean *b, AEKeyword keyWord)
- {
- DescType actualType;
- Size actualSize;
- Boolean oldB = *b;
- OSErr err = AEGetParamPtr (ae,keyWord,typeBoolean,&actualType,b,sizeof(*b),&actualSize);
-
- if (err == errAEDescNotFound)
- { *b = oldB; err = noErr; }
-
- return err;
- }
-
- #pragma mark -
-
- #define kLowerCase "abcdefghijklmnopqrstuvwxyz"
- #define kUpperCase "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- #define kNumerals "0123456789"
- #define kPunctuation "._-"
-
- static pascal OSErr PrepareFilenameForUnix (const AppleEvent *event, AppleEvent *reply)
- {
- OSErr err = noErr;
-
- UInt8 *dataP;
-
- if (!(err = ::GetTextParameter (event,keyDirectObject,&dataP)))
- {
- UInt32 dataSize = GetPtrSize (Ptr (dataP)), index = dataSize;
-
- while (index--)
- {
- // PLpos is my work-around for broken PLstrchr
-
- Str15 testStr = { 1, dataP [index] };
-
- if (!::PLpos (testStr, "\p" kLowerCase kUpperCase kNumerals kPunctuation))
- dataP [index] = '_';
- }
-
- err = ::AEPutParamPtr (reply,keyDirectObject,typeChar,dataP,dataSize);
-
- ::DisposePtr ((Ptr) dataP);
- if (!err) err = ::MemError ( );
- }
-
- return err;
- }
-
- static pascal OSErr DeleteFiles (const AppleEvent *event)
- {
- OSErr err = noErr;
-
- AEDescList fileList;
-
- if (!(err = AEGetParamDesc (event,keyDirectObject,typeAEList,&fileList)))
- {
- OSErr err2 = noErr;
-
- long itemCount;
-
- if (!(err = AECountItems (&fileList,&itemCount)) && itemCount)
- {
- long index = 1;
-
- do
- {
- FSSpec deleteMe;
- AEKeyword dontCareKeyword;
- DescType actualType;
- Size actualSize;
-
- err = AEGetNthPtr (&fileList,index,typeFSS,&dontCareKeyword,&actualType,&deleteMe,sizeof(deleteMe),&actualSize);
- if (err) break;
-
- if (actualType != typeFSS)
- err = paramErr;
- else if (actualSize < sizeof (deleteMe) - sizeof (deleteMe.name) + *(deleteMe.name) + 1)
- err = paramErr;
- else
- err = FSpDelete (&deleteMe);
-
- if (err) break;
- }
- while (++index <= itemCount);
- }
-
- err2 = AEDisposeDesc (&fileList);
- if (!err) err = err2;
- }
-
- return err;
- }
-
- #pragma mark -
-
- static pascal OSErr MakeArchiveSelfExtracting
- (const AppleEvent *ae, AppleEvent *reply, long magicCookie)
- {
- AEDesc aliasDesc;
- OSErr err = AEGetParamDesc (ae,keyDirectObject,typeAlias,&aliasDesc);
-
- if (!err)
- {
- Boolean convertFileName = true;
-
- if (!(err = GetOptionalBoolean (ae,&convertFileName,keyConvertFileName)))
- {
- FSSpec fss;
- Boolean wasChanged;
-
- if (!(err = ResolveAlias (nil,AliasHandle(aliasDesc.dataHandle),&fss,&wasChanged)))
- if (!(err = ConvertSITtoSEA (magicCookie, &fss)))
- {
- if (convertFileName)
- {
- ConstStr255Param dotSIT = "\p.sit";
-
- if (*(fss.name) - *dotSIT + 1 == PLpos (dotSIT, fss.name))
- {
- Str31 newName;
- PLstrcpy (newName, fss.name);
- *newName -= *dotSIT;
- PLstrcat (newName, "\p.sea");
-
- if (!(err = FSpRename (&fss,newName)))
- {
- PLstrcpy (fss.name, newName);
- err = UpdateAlias (nil,&fss,AliasHandle(aliasDesc.dataHandle),&wasChanged);
- }
- }
- }
-
- if (!err)
- err = AEPutParamDesc (reply,keyDirectObject,&aliasDesc);
- }
- }
-
- OSErr err2 = AEDisposeDesc (&aliasDesc);
- if (!err) err = err2;
- }
-
- return err;
- }
-
- static pascal OSErr HandleCountSegments
- (const AppleEvent *ae, AppleEvent *reply, long magicCookie)
- {
- AEDesc fssDesc;
-
- OSErr err = AEGetParamDesc (ae,keyDirectObject,typeFSS,&fssDesc);
-
- if (!err)
- {
- long segSize;
- DescType actualType;
- Size actualSize;
-
- if (!(err = AEGetParamPtr
- (ae,keySegmentSize,typeLongInteger,&actualType,&segSize,sizeof(segSize),&actualSize)))
- {
- HLockHi (fssDesc.dataHandle);
-
- FSSpecPtr targetFSS = FSSpecPtr (*(fssDesc.dataHandle));
-
- short numSegments;
-
- if (!(err = CountSegments (magicCookie,targetFSS,segSize,&numSegments)))
- err = AEPutParamPtr (reply,keyDirectObject,typeShortInteger,&numSegments,sizeof(numSegments));
- }
-
- OSErr err2 = AEDisposeDesc (&fssDesc);
- if (!err) err = err2;
- }
-
- return err;
- }
-
- static pascal OSErr EncodeIntoBinHex
- (const AppleEvent *ae, long magicCookie)
- {
- AEDesc sourceDesc;
-
- OSErr err = AEGetParamDesc (ae,keyDirectObject,typeFSS,&sourceDesc);
-
- if (!err)
- {
- OSErr err2;
- AEDesc destDesc;
-
- if (!(err = AEGetParamDesc (ae,keyDestination,typeFSS,&destDesc)))
- {
- Boolean keepSource = true;
-
- if (!(err = GetOptionalBoolean (ae,&keepSource,keyKeepSource)))
- {
- HLockHi (sourceDesc.dataHandle);
- HLockHi (destDesc.dataHandle);
-
- FSSpecPtr sourceFSS = FSSpecPtr (*(sourceDesc.dataHandle)),
- destFSS = FSSpecPtr (*(destDesc.dataHandle));
-
- err = HQXEncodeFSSpec (magicCookie,sourceFSS,destFSS,
- !keepSource,false,kDefaultHQXCreator);
-
- // there doesn't seem to be any way to return the file
- // that was actually created!
- }
-
- err2 = AEDisposeDesc (&destDesc);
- if (!err) err = err2;
- }
-
- err2 = AEDisposeDesc (&sourceDesc);
- if (!err) err = err2;
- }
-
- return err;
- }
-
- #pragma mark -
-
- static pascal OSErr RespondToMiscFileHandlingEvent
- (const AppleEvent *ae, AppleEvent *reply, AEEventID eventID)
- {
- OSErr err = noErr;
-
- switch (eventID)
- {
- case kEventID_PrepareFilenameForUnix :
-
- err = PrepareFilenameForUnix (ae,reply);
- break;
-
- case kEventID_Delete :
-
- err = DeleteFiles (ae);
- break;
-
- case kEventID_Search :
-
- err = FindFiles (ae,reply);
- break;
-
- default :
-
- err = errAEEventNotHandled;
- break;
- }
-
- return err;
- }
-
- static pascal OSErr RespondToScriptableStuffItEngineEvent
- (const AppleEvent *ae, AppleEvent *reply, AEEventID eventID)
- {
- OSErr err = noErr;
-
- long magicCookie;
-
- if (!(err = OpenSITEngine (kUseExternalEngine, &magicCookie)))
- {
- short engineVersion = GetSITEngineVersion (magicCookie);
-
- if (engineVersion < kFirstSupportedEngine)
- {
- // reply that the engine is too old
- }
- else
- {
- static Boolean warnedAboutRegister;
-
- if (!warnedAboutRegister && !IsSITEngineRegistered (magicCookie))
- err = AEInteractWithUser (kNoTimeOut,nil,nil);
-
- if (!err)
- {
- switch (eventID)
- {
- case kEventID_EncodeIntoBinHex :
-
- err = EncodeIntoBinHex (ae,magicCookie);
- break;
-
- case kEventID_Stuff :
-
- err = Stuff (ae,reply,magicCookie);
- break;
-
- case kEventID_CountSegments :
-
- err = HandleCountSegments (ae,reply,magicCookie);
- break;
-
- case kEventID_MakeArchiveSelfExtracting :
-
- err = MakeArchiveSelfExtracting (ae,reply,magicCookie);
- break;
-
- case kEventID_MakeSegments :
-
- err = MakeSegments (ae,reply,magicCookie);
- break;
-
- default :
-
- err = errAEEventNotHandled;
- break;
- }
- }
-
- warnedAboutRegister = true;
- }
-
- CloseSITEngine (magicCookie);
- }
-
- return err;
- }
-
- #pragma mark -
-
- pascal OSErr ScriptableStuffItAppleEventHandler
- (const AppleEvent *ae, AppleEvent *reply, UInt32)
- {
- AEEventClass eventClass;
- AEEventID eventID;
- DescType actualType;
- Size actualSize;
- OSErr err;
-
- do
- {
- err = ::AEGetAttributePtr (ae, keyEventClassAttr, typeType, &actualType, (Ptr) &eventClass, sizeof (eventClass), &actualSize);
- if (err) break;
- err = ::AEGetAttributePtr (ae, keyEventIDAttr, typeType, &actualType, (Ptr) &eventID, sizeof (eventID), &actualSize);
- if (err) break;
- }
- while (false);
-
- if (!err)
- {
- switch (eventClass)
- {
- case kCoreEventClass :
-
- err = RespondToCoreEvent (ae,reply,eventID);
- if (err == errAEEventNotHandled) err = noErr;
- break;
-
- case kEventClass_ScriptableStuffIt :
-
- err = RespondToScriptableStuffItEngineEvent (ae,reply,eventID);
- break;
-
- case kEventClass_MiscFileHandling :
-
- err = RespondToMiscFileHandlingEvent (ae,reply,eventID);
- break;
-
- default :
-
- err = errAEEventNotHandled;
- break;
- }
-
- if (err != errAEEventNotHandled && reply->dataHandle)
- (void) AEPutParamPtr (reply,keyErrorNumber,typeShortInteger,&err,sizeof(err));
- }
-
- if (err && err != errAEEventNotHandled)
- err = noErr; // eat it; AppleEvent Manager won't do anything good with it
-
- return err;
- }
-